#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace IO
{
	char buff[1<<21],*p1=buff,*p2=buff;
	char getch(){return p1==p2&&(p2=((p1=buff)+fread(buff,1,1<<21,stdin)),p1==p2)?EOF:*p1++;}
	template<typename T>void read(T &x){char CH=getch();int fl=1;x=0;while(CH>'9'||CH<'0'){if(CH=='-')fl=-1;CH=getch();}while(CH<='9'&&CH>='0'){x=x*10+CH-48;CH=getch();}x*=fl;}
	template<typename T>void read_s(T &x){x="";char CH=getch();while(!(CH>='a'&&CH<='z')&&!(CH>='A'&&CH<='Z'))CH=getch();while((CH>='a'&&CH<='z')||(CH>='A'&&CH<='Z')){x+=CH;CH=getch();}}
	template<typename T,typename ...Args>void read(T &x,Args& ...args){read(x);read(args...);}
	char obuf[1<<21],*p3=obuf;
	void putch(char CH) {if(p3-obuf<(1<<21))*p3++=CH;else fwrite(obuf,p3-obuf,1,stdout),p3=obuf,*p3++=CH;}
	char CH[100];
	template<typename T>void write(T x) {if(!x)return putch('0');if(x<0)putch('-'),x*=-1;int top=0;while(x)CH[++top]=x%10+48,x/=10;while(top)putch(CH[top]),top--;}
	template<typename T,typename ...Args>void write(T x,Args ...args) {write(x);putch(' ');write(args...);}
	void put(string s){for(int i=0;i<s.size();i++)putch(s[i]);}
	void flush(){fwrite(obuf,p3-obuf,1,stdout);}
}
using namespace IO;
const int mod=999999999;
int n,m;
struct Shiki
{
	int t[4005];
	inline int lowbit(int x){return x&-x;}
	inline void add(int x,int v){for(;x<=n;x+=lowbit(x))t[x]+=v;}
	inline int query(int x){int res=0;for(;x;x-=lowbit(x))res+=t[x];return res;}
}T[4005];
int a[4005][4005];
signed main()
{
	freopen("fire.in","r",stdin);
	freopen("fire.out","w",stdout);
	read(n,m);
	while(m--)
	{
		int op,dir,opt,x,y;
		read(op);
		if(op==1) 
		{
			read(dir,x,opt,y);
			if(dir==0)
				for(int i=1;i<=n;i++) 
				{
					if(opt==1) T[x].add(i,(a[x][i]&y)-a[x][i]),a[x][i]&=y;
					else if(opt==2) T[x].add(i,(a[x][i]|y)-a[x][i]),a[x][i]|=y;
					else if(opt==3) T[x].add(i,(a[x][i]^y)-a[x][i]),a[x][i]^=y;
					else T[x].add(i,(a[x][i]+y)%mod-a[x][i]),a[x][i]=(a[x][i]+y)%mod;
				}
			else
				for(int i=1;i<=n;i++) 
				{
					if(opt==1) T[i].add(x,(a[i][x]&y)-a[i][x]),a[i][x]&=y;
					else if(opt==2) T[i].add(x,(a[i][x]|y)-a[i][x]),a[i][x]|=y;
					else if(opt==3) T[i].add(x,(a[i][x]^y)-a[i][x]),a[i][x]^=y;
					else T[i].add(x,(a[i][x]+y)%mod-a[i][x]),a[i][x]=(a[i][x]+y)%mod;
				}
		}
		else
		{
			read(x,y);
			int ans=0;
			for(int i=1;i<=x;i++) ans+=T[i].query(y);
			write(ans),putch('\n');
		}
	}
	flush();
	return 0;
}
